# -*- coding: utf-8 -*-
# text_match.py
import jieba
import difflib
from typing import Iterable, List, Set, Tuple

def extract_food(
    user_text: str,
    food_vocab: Iterable[str],
    fuzzy_threshold: float = 0.8,
) -> Tuple[List[str], List[str], List[str]]:
    """根据用户输入提取食物关键词。

    1. 先使用 jieba 分词命中精确词。
    2. 对分词结果做模糊匹配，解决同义词/花式写法。

    Args:
        user_text: 用户原始输入字符串。
        food_vocab: 食物静态数据库的键集合。
        fuzzy_threshold: SequenceMatcher 相似度阈值 (0-1)。

    Returns:
        去重后的食物列表，按出现顺序返回。
    """
    vocab_set: Set[str] = set(food_vocab)
    tokens = jieba.lcut(user_text, cut_all=False)
    hits: List[str] = []
    exact_hits: List[str] = []
    fuzzy_hits: List[str] = []
    added: Set[str] = set()

    for token in tokens:
        # 精确匹配
        if token in vocab_set and token not in added:
            hits.append(token)
            exact_hits.append(token)
            added.add(token)
            continue
        # 模糊匹配
        for food in vocab_set:
            if food in added:
                continue
            if difflib.SequenceMatcher(None, token, food).ratio() >= fuzzy_threshold:
                hits.append(food)
                fuzzy_hits.append(food)
                added.add(food)
                break
    return hits, exact_hits, fuzzy_hits

# 向后兼容的简化接口
def extract_food_simple(user_text: str, food_vocab: Iterable[str], fuzzy_threshold: float = 0.8) -> List[str]:
    """返回仅 food list 的旧版接口，供其他模块调用。"""
    return extract_food(user_text, food_vocab, fuzzy_threshold)[0]

    